package array;

import java.util.Arrays;

/**
 * 给出n,画出含有元素1-n^2的顺时针螺旋矩阵
 * @author liumingju
 * @date 2025/3/17 17:40
 */
public class 旋转数组 {
    public static void main(String[] args) {
        Integer[][] draw = draw(3);
        for(Integer[] row:draw){
            System.out.println(Arrays.deepToString(row));
        }
    }

    // 突破点 1、本质上是画n*n的矩阵,分别画出四条边,value自增即可 2、最大圈数=n/2 3、奇数需要单独处理中心点
    public static Integer [][] draw(int n){
        Integer[][] res = new Integer[n][n];
        int value = 1; //矩阵中需要填写的数字
        int loop = n/2; // 记录当前圈数
        int startx = 0;// x轴起始位置
        int starty = 0;// y轴起始位置
        int offset = 1;// 偏移量
        int curX;
        int curY;
        while (loop>0){
            // 上边
            // 区间为左闭右开，所以curY<res[startx].length-1
            for(curY = starty;curY<n-offset;curY++){
                res[startx][curY] = value++;
            }
            // 右边,区间是上闭下开，所以curX<res.length-1
            for(curX = startx;curX<n-offset;curX++){
                res[curX][curY] = value++;
            }
            // 下边
            for(;curY>starty;curY--){
                res[curX][curY] = value++;
            }
            // 左边
            for(;curX>startx;curX--){
                res[curX][curY] = value++;
            }
            // 更新偏移量（另一圈）
            loop--;
            startx++;
            starty++;
            offset++;
        }
        // 奇数单独处理中心点
        if(n%2!=0){
            res[n/2][n/2] = n*n;
        }
        return res;
    };

}
